#!/usr/bin/env python
# coding: utf-8

# ## 导入算法库与相应模块

# In[7]:


from sklearn import tree   #导入决策树库
from sklearn.datasets import load_wine   #从sklearn的数据库中导入红酒数据
from sklearn.model_selection import train_test_split   #导入训练集与测试集


# In[14]:


wine= load_wine()


# In[15]:


wine   #查看整个红酒数据集，数据以字典的形式存储


# In[16]:


wine.data.shape  #查看几行几列


# In[6]:


wine.target.shape


# # 将红酒数据集以表格形式显示

# In[19]:


import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)  #分别将data与target转化为DataFrame模式，然后利用concat函数\
                                                                        #\将两个表进行连接 ,注意concat函数与merge函数的区别


# In[23]:


wine.feature_names


# In[22]:


wine.target_names


# ## 分训练集和测试集

# In[24]:


Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)  #注意分训练集与测试集时的顺序，顺序不能变
Xtrain.shape   #查看训练集


# In[25]:


Xtest.shape


# ## 建立模型

# In[26]:


#sklearn的建模流程：1.实例化，建立评估模型对象（实例化是需要注意调参）2.通过模型接口训练模型 3.通过模型接口提取需要的信息（数据属性，数据接口）
clf=tree.DecisionTreeClassifier(criterion="entropy")  #实例化
clf=clf.fit(Xtrain,Ytrain)  #用训练集训练模型
score=clf.score(Xtest,Ytest)   #导入测试集，从接口中调用需要的信息，返回预测的精确度


# In[27]:


score   #查看预测的精确度


# In[39]:


feature_name= ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜                   色强度','色调','od280/od315稀释葡萄酒','脯氨酸']  #由于原本的feature_names过于难记，选择自己重新定义一个
import graphviz    #将生成的决策树导出为DOT格式，画图专用
dot_data=tree.export_graphviz(clf                             ,out_file=None                             ,feature_names=feature_name                             ,class_names=["琴酒","雪梨","贝尔摩德"]                             ,filled=True\#调节生成的整个图片的颜色，便于区分（一般带着）
                             rounded("=True#调节生成的节点形状（一般带着就好）")
                                                    )
graph=graphviz.Source(dot_data)
graph


# ##               调参

# In[40]:


clf.feature_importances_   #查看每一个feature_names的重要性
[*zip(feature_name,clf.feature_importances_)]  #将所有的重要程度与names一一对应


# In[43]:


clf=tree.DecisionTreeClassifier(criterion="entropy"                              ,random_state=30                              ,splitter="random"                              
                                                      )
clf=clf.fit(Xtrain,Ytrain)
score=clf.score(Xtest,Ytest)
score


# In[95]:


score=clf.score(Xtrain,Ytrain)
score


# In[ ]:




